/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.util.Properties;
import javax.persistence.EntityManager;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import sun.security.krb5.Config;
import views.ConfigServer;
import views.OpcionesAvanzadas;
import views.VistaDisponibilidad;

/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class LogicaBackUp {

    private int BUFFER = 20485760;
    //para guardar en memmoria
    private StringBuffer temp = null;
    //para guardar el arch  ivo SQL
    private FileWriter fichero = null;
    private PrintWriter pw = null;
    private  EntityManager entityManager;

    public void restartBackUp() throws IOException {
        entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        String host = "";
        String port = "";
        String user = "";
        String db = "";
        String password = "";

        FileInputStream is;
        Properties prop = new Properties();
        if ((!propertiesFileGenerado()) || (!propertiesFileContiene("host")) || (!propertiesFileContiene("puerto")) || (!propertiesFileContiene("usuario")) || (!propertiesFileContiene("pass")) || (!propertiesFileContiene("db"))) {
            OpcionesAvanzadas.seleccionarConfigServer();
        }
        if (propertiesFileGenerado()) {
            try {
                is = new FileInputStream(ConfigServer.rutaPropertiesFile);
                prop.load(is);
                is.close();
            } catch (IOException ioex) {
                ioex.printStackTrace();
            }
            host = prop.getProperty("host");
            port = prop.getProperty("puerto");
            user = prop.getProperty("usuario");
            db = prop.getProperty("db");
            password = prop.getProperty("pass");
        }


        try {
            JFileChooser chooser = new JFileChooser();
            chooser.setDialogTitle("Selección de Restaurar Back Up de Base de Datos");
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            chooser.setAcceptAllFileFilterUsed(false);
            FileNameExtensionFilter filter = new FileNameExtensionFilter("SQL", "sql");
            chooser.setFileFilter(filter);
            if (chooser.showSaveDialog(chooser) == JFileChooser.APPROVE_OPTION) {
                JOptionPane.showMessageDialog(null, "Se va a realizar la restauracion , esta tarea se puede demorar", "Atención", JOptionPane.INFORMATION_MESSAGE, null);
                String rutaFile = chooser.getSelectedFile().toString();

                Process run = Runtime.getRuntime().exec("cmd /c mysql.exe --host=" + host + " --user=" + user + " --password=" + password + " --port=" + port +" "+ db + " --default-character-set=utf8 <" + rutaFile);
                BufferedReader in = new BufferedReader(new InputStreamReader(run.getErrorStream()));
                String inputLine;
                inputLine = in.readLine();
                if (inputLine == null) {
                    JOptionPane.showMessageDialog(null, "Se importo el Back Up Correctamente", "Atención", JOptionPane.INFORMATION_MESSAGE, null);
                } else {
                    JOptionPane.showMessageDialog(null, "Error no se importo el Back Up por el siguiente motivo:\n" + inputLine, "Verificar", JOptionPane.ERROR_MESSAGE);
                }

            }

        } catch (IOException ioe) {
            //Muestra por consola los errores
            JOptionPane.showMessageDialog(null, "Error no se importo el Back Up por el siguiente motivo:" + ioe.getMessage(), "Verificar", JOptionPane.ERROR_MESSAGE);

        }
         VistaDisponibilidad.resetear(entityManager);
    }

    public boolean propertiesFileGenerado() {
        FileInputStream is = null;
        try {
            is = new FileInputStream(ConfigServer.rutaPropertiesFile);
            is.close();
            return true;
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "No se puede abrir el archivo properties/No está creado");
            return false;
        }
    }

    public boolean propertiesFileContiene(String key) {
        Properties prop = new Properties();
        FileInputStream is = null;
        try {
            is = new FileInputStream(ConfigServer.rutaPropertiesFile);
            prop.load(is);
            is.close();
            if (prop.getProperty(key) == null) {
                return false;
            }
            return true;
        } catch (IOException ioex) {
            ioex.printStackTrace();
        }
        return false;
    }

    public void crearBackup() {

        String host = "";
        String port = "";
        String user = "";
        String password = "";
        String db = "";
        FileInputStream is;
        Properties prop = new Properties();
        if ((!propertiesFileGenerado()) || (!propertiesFileContiene("host")) || (!propertiesFileContiene("puerto")) || (!propertiesFileContiene("usuario")) || (!propertiesFileContiene("pass")) || (!propertiesFileContiene("db"))) {
            OpcionesAvanzadas.seleccionarConfigServer();
        }
        if (propertiesFileGenerado()) {
            try {
                is = new FileInputStream(ConfigServer.rutaPropertiesFile);
                prop.load(is);
                is.close();
            } catch (IOException ioex) {
                ioex.printStackTrace();
            }
            host = prop.getProperty("host");
            port = prop.getProperty("puerto");
            user = prop.getProperty("usuario");
            password = prop.getProperty("pass");
            db = prop.getProperty("db");
        }



        int respuesta = 0;
        String txtNombre = "";
        JFileChooser chooser = new JFileChooser();
        chooser.setDialogTitle("Selección de Back Up de Base de Datos");
        chooser.setCurrentDirectory(new java.io.File("."));
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("SQL", "sql");
        chooser.setFileFilter(filter);





        if (chooser.showSaveDialog(chooser) == JFileChooser.APPROVE_OPTION) {

            txtNombre = chooser.getSelectedFile().toString();
            File ficheroCheck = new File(txtNombre);
            if (ficheroCheck.exists()) {
                respuesta = JOptionPane.showConfirmDialog(null, "El archivo ya existe.¿Quieres reemplazarlo?",
                        "Confirmar Reemplazo", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);

            } else {
                respuesta = JOptionPane.OK_OPTION;
                txtNombre += ".sql";
            }
            if (respuesta == JOptionPane.OK_OPTION) {
                JOptionPane.showMessageDialog(null, "Se va a realizar el back up , esta tarea se puede demorar", "Atención", JOptionPane.INFORMATION_MESSAGE, null);

                try {

                    //sentencia para crear el BackUp
                    Runtime.getRuntime().exec(
                            "mysqldump --host=" + host + " --port=" + port
                            + " --user=" + user + " --password=" + password
                            + " --default-character-set=utf8 " + db + " -r " + txtNombre + " --databases project");
                    


                    /* se crea y escribe el archivo SQL */

                    JOptionPane.showMessageDialog(null, "Se realizo el Back Up Correctamente", "Atención", JOptionPane.INFORMATION_MESSAGE, null);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error no se genero el archivo por el siguiente motivo:" + ex.getMessage(), "Verificar", JOptionPane.ERROR_MESSAGE);
                } finally {
                    try {
                        if (null != fichero) {
                        }
                    } catch (Exception e2) {
                        JOptionPane.showMessageDialog(null, "Error no se genero el archivo por el siguiente motivo:" + e2.getMessage(), "Verificar", JOptionPane.ERROR_MESSAGE);
                    }


                }



            }
        }



    }
}